<?php 
class notificacao_notificaModel extends Model{
    public $tabela            = 'notificacao_notifica';
    public $pkey              = 'notificacao_notifica_cod';
    public $model_label       = 'Notificações';
    public $model_description = 'As notificações serão utilizadas para alertar os
        usuários que acessam o site quando ocorre algum novo evento relacionado à ele.';
    public $dados  = array(
        
         'notificacao_notifica_cod' => array(
	    'name'     => 'Código',
	    'type'     => 'int',
	    'size'     => '11',
	    'pkey'    => true,
	    'ai'      => true,
	    'grid'    => true,
	    'display' => true,
	    'private' => true
        ),
        
         'notificacao_notifica_autor' => array(
	    'name'     => 'Autor',
	    'type'     => 'int',
	    'size'     => '11',
	    'grid'    => true,
            'especial' => 'autentication',
            'autentication' => array('needlogin' => true),
	    'display' => true,
	    'fkey' => array(
	        'model' => 'usuario/login',
	        'cardinalidade' => '1n',
	        'keys' => array('cod_usuario', 'user_name'),
	    ),
        ),
        
        'notificacao_notifica_destinatario' => array(
	    'name'     => 'Destinatário',
	    'type'     => 'int',
	    'size'     => '11',
	    'grid'    => true,
	    //'display' => true,
	    'fkey' => array(
	        'model' => 'usuario/login',
	        'cardinalidade' => '1n',
	        'keys' => array('cod_usuario', 'user_name'),
	    ),
        ),
         'notificacao_notifica_titulo' => array(
	    'name'     => 'Título',
	    'type'     => 'varchar',
	    'size'     => '64',
	    'grid'    => true,
	    'display' => true,
        ),
         'notificacao_notifica_mensagem' => array(
	    'name'     => 'Mensagem',
	    'type'     => 'varchar',
            'size'     => '256',
	    'grid'     => true,
	    'display'  => true,
        ),
        'notificacao_notifica_data' => array(
	    'name'     => 'Data',
	    'type'     => 'timestamp',
            'especial' => 'hide',
	    'notnull' => true,
	    'grid'    => true,
	    'display' => true,
        ),
         'notificacao_notifica_url' => array(
	    'name'     => 'Url',
	    'type'     => 'varchar',
	    'size'     => '128',
	    'grid'    => true,
	    'display' => true,
        ),
        
         'notificacao_notifica_lida' => array(
	    'name'     => 'Lida',
	    'type'     => 'enum',
	    'default'  => 'unread',
            'options' => array(
                'read'   => 'Lida',
                'unread' => 'Não Lida'
             ),
	    'grid'     => true,
	    'display'  => true,
            'private'  => true,
        ),
        
        'button'     => array('button' => 'Gravar Notificação')
     );
    
    private function paginateWhere($adwhere){
        $this->LoadModel('usuario/login', 'uobj');
        $cod = $this->uobj->getCodUsuario();
        $var = "notificacao_notifica_destinatario = '$cod'";
        return ($adwhere == "")?$var:"$adwhere AND $var";
    }
    public function paginate($page, $link = "", $cod_item = "", $campo = "", $qtd = 20, $campos = array(), $adwhere = "", $orderby = "") {
        $adwhere = $this->paginateWhere($adwhere);
        return parent::paginate($page, $link, $cod_item, $campo, $qtd, $campos, $adwhere, "notificacao_notifica_data DESC");
    }
    
    public function getPaginationCount($adwhere = "", $cod_item = "", $campo = "") {
        $adwhere = $this->paginateWhere("notificacao_notifica_lida = 'unread'");
        return parent::getPaginationCount($adwhere);
    }
    
    public function setAllRead(){
        $cod_usuario = usuario_loginModel::CodUsuario();
        $this->db->ExecuteQuery("
            UPDATE $this->tabela 
            SET notificacao_notifica_lida = 'read' 
            WHERE notificacao_notifica_destinatario = '$cod_usuario'
        ");
    }
    
    public function setRead($cod_notificacao){
        $arr['notificacao_notifica_lida']     = '1';
        return parent::editar($cod_notificacao, $arr);
    }
    
    public function setUnRead($cod_notificacao){
        $arr['notificacao_notifica_lida']     = '1';
        return parent::editar($cod_notificacao, $arr);
    }
    
    public function alertar($assunto, $corpo, $destinatarios, $url, $email_remetente = ""){
        
        $this->LoadModel('usuario/login', 'uobj');
        $cod_usuario = $this->uobj->getCodUsuario($email_remetente);
        
        foreach($destinatarios as $cod => $dest){
            $cod_destinatario = $this->uobj->getCodUsuario($dest);
            if($cod_usuario == $cod_destinatario) continue;
            $post = array(
                'notificacao_notifica_autor'        => $cod_usuario,
                'notificacao_notifica_destinatario' => $cod_destinatario,
                'notificacao_notifica_titulo'       => $assunto,
                'notificacao_notifica_mensagem'     => $corpo,
                'notificacao_notifica_url'          => $url,
                'notificacao_notifica_lida'         => 'unread'
            );
            if($cod_usuario == 0) unset($post['notificacao_notifica_autor']);
            
            //evita o envio de spans para os usuários
            $total = $this->getCount("
                notificacao_notifica_url = '$url' && 
                notificacao_notifica_destinatario = '$cod_destinatario' &&
                notificacao_notifica_lida = 'unread'"
            );
            if($total == 0) if(!$this->inserir($post))return false;
            else unset($destinatarios[$cod]);
        }
        if(empty($destinatarios)) return true;
        
        $this->LoadResource('html', 'html');
        $url = $this->html->getLink($url);
        $corpo .= "<hr/><p>Para acessar esta notificação <a href='$url'>clique aqui</a></p><br/>
        <p>Caso não consiga visualizar o link acima: $url</p>";
        
        $this->SendAlerts($assunto, $corpo, $destinatarios, $url, $email_remetente);
        return true;
    }
    
    private function SendAlerts($assunto, $corpo, $destinatarios, $url, $email_remetente){
        $this->LoadClassFromPlugin('notificacao/alertas/emailAlert', 'alert');
        if(!$this->alert->alertar($assunto, $corpo, $destinatarios, $url, $email_remetente)){
            $this->setAlertMessage($this->alert->getErrorMessage());
            return false;
        }
        return true;
    }
    
    public function apagar($valor, $chave = "") {
        $item = $this->getItem($valor, $chave, true, array('notificacao_notifica_url'));
        return parent::apagar($item['notificacao_notifica_url'], 'notificacao_notifica_url');
    }
    
    public function unstall($plugin){
        $where = "notificacao_notifica_url LIKE '$plugin/%'";
        if(!$this->db->Delete($this->tabela, $where)){
            $this->setErrorMessage($this->db->getErrorMessage());
            return false;
        }
        return true;
    }
}
?>